
package com.ys.chatserver.im.dto;

import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;

/**
 * 消息body根类：普通聊天消息（指的是区别于非聊天消息的指令）中提炼出来的共有
 * 消息体字段属性。
 * <p>
 * 即聊天数据从MobileIMSDK底层发送时，会将本对象转JSON字串后，作为
 * Protocal的dataContent数据进行传输。
 * <p>
 * <b>理论上：</b>RainbowChat中用户可读的聊天消息（包括单聊、陌生人聊、世界频道、群聊）
 * 的消息body都应是本类的子类，否则服务端的离线处理将不会进行离线消息持久化（前提
 * 是需要离线存储的话，比如世界频道已经从逻辑上不需要支持离线的）。
 *
 * @author Jack Jiang
 * @since 4.3
 */
public class MsgBodyRoot implements MsgType, ChatType {
    /**
     * From user uid（即消息发送者的id）.
     */
    public long time;

    protected String f = null;
    /**
     * To user id or group id。
     * <p>
     * <b>即消息接收者的id：</b><br>
     * 1）在群聊消息时，本字段存放的是群组id；<br>
     * 2）普通一对的聊天时才是用户uid。
     */
    protected String t = null;

    /**
     * 消息内容字段（为了简化复杂性，建议保证只放纯文本）。
     */
    protected String m = null;

    /**
     * 通道id
     */
    protected String channelId;

    /**
     * 消息内容扩展字段2，不用时可为空。
     * <p>
     * 当前用途：
     * 1）用于文件消息时的文件md5码。
     *
     * @since 4.3
     */
    protected String m2 = null;

    /**
     * 消息内容扩展字段3，不用时可为空。
     * <p>
     * 当前用途：
     * 1）用于文件消息时的文件长度（long整数）。
     *
     * @since 4.3
     */
    protected String m3 = null;

    /**
     * 聊天模式类型（默认值为 {@link #CHAT_TYPE_FREIDN$CHAT} ）.
     */
    protected int cy = CHAT_TYPE_FREIDN$CHAT;

    /**
     * 聊天消息类型（默认值为 {@link #TYPE_TEXT} ）.
     */
    protected int ty = TYPE_TEXT;

    public MsgBodyRoot() {
        //
    }

    public String getF() {
        return f;
    }

    public void setF(String f) {
        this.f = f;
    }

    public String getT() {
        return t;
    }

    public void setT(String t) {
        this.t = t;
    }

    public String getM() {
        return m;
    }

    public void setM(String m) {
        this.m = m;
    }

    public int getTy() {
        return ty;
    }

    public void setTy(int ty) {
        this.ty = ty;
    }

    public String getM2() {
        return m2;
    }

    public void setM2(String m2) {
        this.m2 = m2;
    }

    public String getM3() {
        return m3;
    }

    public void setM3(String m3) {
        this.m3 = m3;
    }

    public int getCy() {
        return cy;
    }

    public void setCy(int cy) {
        this.cy = cy;
    }

    public String getChannelId() {
        return channelId;
    }

    public void setChannelId(String channelId) {
        this.channelId = channelId;
    }

    /**
     * 从JSON字串中反序列化。
     *
     * @param originalMsg 即MsgBodyRoot对象的JSON序列化文本
     * @return 解析成功则返回对象，否则返回null
     * @since 2.0_rc11
     */
    public static MsgBodyRoot parseFromSender(String originalMsg) {
        try {
            return new Gson().fromJson(originalMsg, MsgBodyRoot.class);
        } catch (JsonSyntaxException e) {
            return null;
        }
    }
}
